let input={
    a:1,
    b:[1,2,{c:true},[3]],
    d:{e:4,f:5},
    g:6
}
let output={
    a:1,
    'b[0]':1,
    'b[1]':2,
    'b[2].c':true,
    'b[3][0]':3,
    'd.e':4,
    'd.f':5,
    g:6
}
//逻辑：
//1. 设置一个空字符串，为了后续的拼接
//2. 遍历对象，判断是否存在上一层的key，如果存在则进行拼接，成一个新的key，为下次递归做准备
//3. 判断当前值是否为对象，如果是对象则递归调用
//4. 如果不是对象则直接赋值
function flattenObj(obj){
    let res={}
    function dfs(target,oldkey){//oldkey为上一次递归的的key
        for(let key in target){
            let newkey;//表示当前更新后的key
            if(oldkey){//如果走了递归后才会有oldkey
                if(Array.isArray(target)){//判断是否为数组
                    newkey=`${oldkey}[${key}]`
                }else{//否则为对象时
                    newkey=`${oldkey}.${key}`
                }
            }else{//如果没有走递归则直接作为key
                newkey=key
            }
            if(typeof target[key]==='object'&&target[key]!==null){
                dfs(target[key],newkey)
            }else{
                res[newkey]=target[key]
            }
        }
    }
    dfs(obj,'')
    return res
}
console.log(flattenObj(input));
